\chapter{PCRE2正则库应用案例}
本章根据\ref{intro-sec-regex-cases}节中整数有效性判断、电话号码有效性判断、
整数重复数字判断、找最亲近同学、比压牌和牌型分类6典型应用案例的需求，
使用PCRE2正则库实现了正则表达式的编程。

\section{整数范围判断}
正整数字符串有效性判断的实现如代码\ref{code-int-range-pcre2}所示。

\cvfile[label=code-int-range-pcre2]{PCRE2正则判断正整数范围有效性}%
  {pcre2-regex/codes/int-range/int-range-pcre2.c}

在代码\ref{code-int-range-pcre2}中，第74行创建了匹配寄存器\cinline{match_data}。
虽然该问题并不关注匹配的位置，但第77-83行的\cinline{pcre2_match()} 函数调用中，
仍然需要为其传入匹配寄存器的地址。另外在完成匹配操作后，需要释放匹配寄存器和正则
缓存占有的存储空间(第86---87行)。

\section{电话号码判断}
城市电话号码有效性判断的实现如代码\ref{code-phonenum-pcre2}所示。

\cvfile[label=code-phonenum-pcre2]{PCRE2正则判断电话号码字符串有效性}%
  {pcre2-regex/codes/phonenum/phonenum-check-pcre2.c}

在代码\ref{code-phonenum-pcre2}的设计逻辑与代码\ref{code-int-range-pcre2}的
设计逻辑一致。
% 在代码\ref{code-phonenum-pcre2}中，第77行创建了匹配寄存器\cinline{match_data}。
% 虽然该问题并不关注匹配的位置，但第80-86行的\cinline{pcre2_match()} 函数调用中，
% 仍然需要为其传入匹配寄存器的地址。

\section{判断重复数字}
判断整数中的重复数字的实现如代码\ref{code-repetition-pcre2}所示。

\cvfile[label=code-repetition-pcre2]{PCRE2正则判断并显示重复数字}%
  {pcre2-regex/codes/repetitionnum/repetition-numb-pcre2.c}

在代码\ref{code-repetition-pcre2}中，第92---104行实现了第1次匹配，并在匹配寄存器%
\cinline{match_data}中记录了匹配位置，第107行根据匹配寄存器得到匹配向量。
第110---125行的\cinline{while}循环中，首先输出已匹配的字符，然后用匹配向量实现了
再次扫描匹配的起始位置偏移，再次匹配后进入下一次循环。

\section{寻找亲近同学}
寻找亲近同学的实现如代码\ref{code-findclosest-pcre2}所示。

\cvfile[label=code-findclosest-pcre2]{PCRE2正则寻找亲近同学}%
  {pcre2-regex/codes/findclosest/findclosest-pcre2.c}

在代码\ref{code-findclosest-pcre2}中，第95---125行实现了循环匹配。第98行实现了
字符串的偏移，第104行获取匹配向量，第122行实现了偏移量计算。第107---111行在匹配
失败时结束循环。

\section{比压牌}
比压牌的实现如代码\ref{code-judgepoker-pcre2}所示。

\cvfile[label=code-judgepoker-pcre2]{PCRE2正则判断比压牌}%
  {pcre2-regex/codes/judgepoker/judgepoker-pcre2.c}

在代码\ref{code-judgepoker-pcre2}中，第50---59行定义了正则表达式查找表。
第61---69行根据对方出牌张数，在正则表达式查找表中取得需要的正则表达式，然后
实现正则匹配。虽然该问题并不关注匹配的位置，但第92---93行的%
\cinline{pcre2_match()} 函数调用中，仍然需要为其传入匹配寄存器的地址。

\section{牌型分类}
牌型分类的实现如代码\ref{code-classifypoker-pcre2}所示。

\cvfile[label=code-classifypoker-pcre2]{PCRE2正则牌型分类}%
  {pcre2-regex/codes/classify-poker-5cards/classify-poker-5cards-pcre2.c}

在代码\ref{code-classifypoker-pcre2}中，第53---64行定义了正则表达式数组。
第68---109行通过遍历正则表达式数组，通过正则搜索获得能够匹配的正则表达式下标索引。
实现正则匹配。虽然该问题并不关注匹配的位置，但第93---94行的%
\cinline{pcre2_match()} 函数调用中，仍然需要为其传入匹配寄存器的地址。

当然，如果所有正则表达式都无法匹配，则返回循环结束后的\cinline{i}值(第86行)。
